home *** CD-ROM | disk | FTP | other *** search
- {
- I saw a postihg yesterday requesting source code for the Tower of Hanoi
- problem. This proplem is an old chestnut which we drag out to demonstrate
- recursion after we realize that factorial is really iteration.
-
- Here is source code done in TPW1.5.
- }
-
- program TowersofHanoi;
-
- uses
- CRT; { Not needed unless using Windows version }
- { copyright 1993 E. Kurt TeKolste }
- { no rights reserved }
-
- const
- Max = 20; { Use all of this at your peril }
- A = 'A'; { Names of the three towers }
- B = 'B';
- C = 'C';
-
- type
- Stack = 1..Max;
- Disk = 0..Max;
-
- Tower = object
- Depth : integer; { the current number of disks on the tower }
- V : array[Stack] of Disk; { the sizes of the disks on the tower }
-
- constructor Init(N : integer); {creates a tower with disks 1..N }
- procedure Add(D : Disk); { Adds a disk of size D on top }
- function Remove : Disk; { Removes the top disk and returns its size }
- procedure Print; { Prints a tower }
- end;
-
- constructor Tower.Init(N : integer);
- var
- I : Disk;
- begin
- Depth := N;
- for I := 1 to N do V[I] := I;
- for I := succ(N) to Max do V[I] := 0;
- end;
-
- procedure Tower.Add(D : Disk);
- begin
- Depth := succ(Depth);
- V[Depth] := D;
- end;
-
- function Tower.Remove : Disk;
- begin
- Remove := V[Depth];
- Depth := pred(Depth);
- end;
-
- procedure Tower.Print;
- var
- I : Stack;
- begin
- clreol;
- for I := 1 to Depth do write(V[I]:3);
- end;
-
- type
- Hanoi = object
- Display : boolean; { If true, each move is displayed. }
- Pause : boolean; { If true, waits for keypress to continue after
- each move. }
- S : Stack; { The number of disks on the towers.}
- H : array[A..C] of Tower;
-
- constructor Init(I : Stack; On : boolean; Wait : boolean);
- { Creates a tower of Hanoi with I disks, the display
- determined by On and the pause determined by Wait. }
- procedure Move( N : integer; var Source, Sink, Using : Tower);
- { Moves the top N disks from Source to Sink using Using. }
- procedure Transfer;
- { Moves all of the disks from A to C. }
- procedure Print;
- { Prints the Towers of Hanoi }
- end;
-
- constructor Hanoi.Init(I : Stack; On : boolean; Wait : boolean);
- begin
- if I < Max then S := I else S := Max;
- Display := On;
- Pause := Wait;
- H[A].Init(S);
- H[B].Init(0);
- H[C].Init(0);
- end;
-
- procedure Hanoi.Move(N : integer; var Source, Sink, Using : Tower);
- var
- F : char;
- begin
- if N > 0 then
- begin
- Move(N-1, Source, Using, Sink);
- Sink.Add(Source.Remove);
- if Display then
- begin
- Print;
- if Pause then
- begin
- repeat until keypressed;
- F := readkey;
- end;
- end;
- Move(N-1, Using, Sink, Source);
- end;
- end;
-
- procedure Hanoi.Print;
- var
- X : A..C;
- begin
- for X := A to C do
- begin
- gotoxy(1,ord(X) - Ord(A) + 1);
- H[X].Print;
- end;
- end;
-
- procedure Hanoi.Transfer;
- begin
- Move(S, H[A], H[B], H[C]);
- end;
-
- var
- T : Hanoi;
- begin
- with T do
- begin
- Init(6,true,true);
- Transfer;
- end;
- end.